package com.hmall.item.service;

import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

/**
 * @version 1.0
 * @description 说明
 * @package cn.itcast.account.service
 */
@LocalTCC // 开启Seata 的 TCC 模式
public interface ItemTCCService {

    /**
     * 扣减库存
     * 1 扣减item表可用库存
     * 2 记录冻结库存和事务状态到item_freeze表
     * @param itemId
     * @param num
     *
     */
    @TwoPhaseBusinessAction(name = "deduct",
        commitMethod = "confirm",rollbackMethod = "cancel") //该注解添加在deduct方法上，参数对应接口中的每个方法名
    void deduct(@BusinessActionContextParameter(paramName = "itemId") Long itemId,
                @BusinessActionContextParameter(paramName = "num") int num);

    /**
     * 确认业务，根据xid删除item_freeze表的冻结记录
     * @param ctx
     * @return
     */
    boolean confirm(BusinessActionContext ctx);

    /**
     * 撤消回滚，需要把库存还原
     * 1 修改item_freeze表，冻结金额为0，state为2
     * 2 修改item表，恢复可用金额
     * @param ctx
     * @return
     */
    boolean cancel(BusinessActionContext ctx);
}